www.gusucode.com > VC++ 立体声文件播放并录音-源码程序 > VC++ 立体声文件播放并录音-源码程序/code/HwMCI.cpp

    // HwMCI.cpp: implementation of the CHwMCI class.
// Download by http://www.NewXing.com
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "hwPlayWavByMCI.h"
#include "HwMCI.h"

// 为 MCI 函数添加库文件
#include <mmsystem.h>
#pragma comment ( lib, "winmm.lib" )

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHwMCI::CHwMCI()
	: m_wDeviceID ( NULL )
{
	memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) );
}

CHwMCI::~CHwMCI()
{
	Close ();
}

MCIERROR CHwMCI::hwMciSendCommand(
		MCIDEVICEID IDDevice, 
		UINT uMsg,             
		DWORD fdwCommand,      
		DWORD dwParam
	)
{
	MCIERROR mciError = ::mciSendCommand ( IDDevice, uMsg, fdwCommand, dwParam );
	if ( mciError != 0 )
	{
		memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) );
		mciGetErrorString ( mciError, m_szErrorStr, sizeof(m_szErrorStr) );
#ifdef _DEBUG
		AfxMessageBox ( m_szErrorStr );
#endif
	}

	return mciError;
}

BOOL CHwMCI::Open(LPCTSTR lpszWaveFileName/*=NULL*/)
{
	MCI_OPEN_PARMS OpenParms = {0};
	OpenParms.lpstrDeviceType = (LPCSTR)(lpszWaveFileName?NULL:MCI_DEVTYPE_WAVEFORM_AUDIO);
	OpenParms.lpstrElementName = (LPCSTR)(lpszWaveFileName?lpszWaveFileName:"");	// 打开的声音文件名
	m_wDeviceID = NULL;	// 打开的音频设备的ID
	if ( hwMciSendCommand ( NULL,
		MCI_OPEN,
		( lpszWaveFileName?0:(MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID) ) | MCI_WAIT | MCI_OPEN_ELEMENT,
		(DWORD)(LPVOID) &OpenParms ) != 0 )
		return FALSE;

	m_wDeviceID = OpenParms.wDeviceID;
	return TRUE;
}

void CHwMCI::Close()
{
	if ( m_wDeviceID != NULL )
	{
		hwMciSendCommand ( m_wDeviceID, MCI_CLOSE, NULL, NULL );
	}
	m_wDeviceID = NULL;	// 打开的音频设备的ID

}

BOOL CHwMCI::Play(DWORD dwFrom/*=0*/, DWORD dwTo/*=0*/)
{
	Stop ();
	// 播放wave文件
	MCI_PLAY_PARMS PlayParms = {0};
	PlayParms.dwFrom = dwFrom;		// 这是为了指定从什么地方(时间)播放WAVE文件
	PlayParms.dwTo = dwTo;
	if ( hwMciSendCommand ( m_wDeviceID, MCI_PLAY, MCI_FROM,
		(DWORD)(LPVOID)&PlayParms ) != 0 )
		return FALSE;

	return TRUE;

}

BOOL CHwMCI::Stop()
{
	if ( m_wDeviceID == NULL ) return FALSE;

	return ( hwMciSendCommand ( m_wDeviceID, MCI_STOP, NULL, NULL ) == 0 );
}

BOOL CHwMCI::Pause()
{
	if ( m_wDeviceID == NULL ) return FALSE;

	return ( hwMciSendCommand ( m_wDeviceID, MCI_PAUSE, NULL, NULL ) == 0 );
}

BOOL CHwMCI::Save(CString Filename)
{
	Stop ();
	MCI_SAVE_PARMS SaveParms = {0};
	SaveParms.lpfilename = (LPCSTR) Filename;
	return ( hwMciSendCommand ( m_wDeviceID, 
		MCI_SAVE, 
		MCI_SAVE_FILE | MCI_WAIT, 
		(DWORD)(LPVOID) &SaveParms) == 0 );
}

LPSTR CHwMCI::GetErrorStr()
{
	return m_szErrorStr;
}

BOOL CHwMCI::Rec ( int nChannels/*=2*/ )
{
	if ( nChannels != 1 && nChannels != 2 )
		return FALSE;

	Close ();	// 为成功打开设备,录制前关闭一次设备
	if ( !Open () ) return FALSE;
	SetPara ( WAVE_FORMAT_PCM, nChannels, 11025, 11025*nChannels, nChannels, 8 );

	MCI_RECORD_PARMS RecordParms = {0};
	return ( hwMciSendCommand ( m_wDeviceID, 
		MCI_RECORD, 
		NULL, 
		(DWORD)(LPVOID) &RecordParms) == 0 );
}

BOOL CHwMCI::DeviceIDValid()
{
	return ( m_wDeviceID != NULL );
}

//
// 设置参数
//
BOOL CHwMCI::SetPara (
		WORD        wFormatTag,			/* format type */
		WORD        nChannels,			/* 纪录声音的通道数 */
		DWORD       nSamplesPerSec,		/* 记录每秒取样数 */
		DWORD       nAvgBytesPerSec,	/* 记录每秒的数据量 */
		WORD        nBlockAlign,		/* 记录区块的对齐单位 */
		WORD        wBitsPerSample		/* 记录每个取样所需的位元数 */
	)
{
	if ( m_wDeviceID == NULL )
		return FALSE;

	MCI_WAVE_SET_PARMS  SetParms = {0};
	SetParms.wFormatTag = wFormatTag;
	SetParms.nChannels = nChannels;
	SetParms.nSamplesPerSec = nSamplesPerSec;
	SetParms.nAvgBytesPerSec = nAvgBytesPerSec;
	SetParms.nBlockAlign = nBlockAlign;
	SetParms.wBitsPerSample = wBitsPerSample;

	return ( hwMciSendCommand ( m_wDeviceID, MCI_SET, MCI_WAIT |
		MCI_WAVE_SET_FORMATTAG | MCI_WAVE_SET_CHANNELS | MCI_WAVE_SET_SAMPLESPERSEC | MCI_WAVE_SET_AVGBYTESPERSEC |
		MCI_WAVE_SET_BLOCKALIGN | MCI_WAVE_SET_BITSPERSAMPLE,
		(DWORD)(LPVOID) &SetParms ) == 0 );

}

//u 最大录音时长的处理,超过这个时间,应该自动将文件保存